#include <iostream>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
using namespace std;
class msg{
private:
	key_t key;
	int msgid;
	long type;
public:
	struct msgbuf{
		long type;
		char text[512];
	};
	msg();
	~msg();
	msg& operator[](int index);
	void snd(const string& data);
	void recv(int &size);
};
/*{{{*/
msg::msg(){
	key=ftok("./msg",6);
	if(key==-1){perror("创建key值失败");return;}
	msgid=msgget(key,IPC_CREAT|0664);
	if(msgid==-1){perror("创建消息队列失败");return;}
	cout << "创建消息队列成功:" << msgid << endl;
}
msg::~msg(){
	if(msgctl(msgid,IPC_RMID,NULL)==-1){perror("删除消息队列失败");return;}
	cout << "删除消息队列成功" << endl;
}
msg& msg::operator[](int index){
	type=index;
	cout << "设置为<" << index << ">读写消息" << endl;
	return *this;
}
void msg::snd(const string& data){
	msgbuf msgbbuf;
	msgbbuf.type=type;
	strncpy(msgbbuf.text,data.c_str(),511);
	if(msgsnd(msgid,&msgbbuf,strlen(msgbbuf.text),0)==-1){perror("发送消息失败");return;}
	cout << "发送消息至<ID=" << msgid << " type=" << msgbbuf.type << ">成功" << endl;
}
void msg::recv(int &size){
	msgbuf msgbbuf={0};
	msgbbuf.type=type;
	if(msgrcv(msgid,&msgbbuf,512,type,0)==-1){perror("接收消息失败");return;}
	size=strlen(msgbbuf.text);
	cout << "接收消息<msgID=" << msgid << " type=" << type << ">:" << msgbbuf.text << endl;
}
/*}}}*/
int main(int argc,const char*argv[])
{
	msg A;
	A[5];
	int size;
	string n;
	int m=atoi(argv[1]);
	cout << m << endl;
	if(m==0)
	{
		while(1){
			A.recv(size);
			cout << "size=" << size << endl;
		}
	}
	if(m==1)
	{
	A.snd("你好");
		while(1){

			cout << "请输入消息:";
			cin >> n;
			A.snd(n);
		}
	}
	return 0;
}
